package ouc.pkere.utils.generator.config.xmltools;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import ouc.pkere.utils.generator.config.entity.*;
import ouc.pkere.utils.generator.config.entity.DbSqlModuleItemEntity;
import ouc.pkere.utils.generator.config.entity.DbSqlModulesEntity;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 平台配置文件AppConfig.xml db-sql-modules解析器
 *
 * @author wang xiaodong
 * 2018-06-11
 */
public class DbSqlModulesConfigXmlDomParser {

    private Document document;
    private static DbSqlModulesConfigXmlDomParser dbSqlModulesConfigXmlDomParser
            = new DbSqlModulesConfigXmlDomParser();

    private DbSqlModulesConfigXmlDomParser() {

    }

    /**
     * 将XML中基于关系型数据库的模块配置部分解析封装为DbSqlModulesEntity对象
     * DbSqlModulesEntity
     */
    public DbSqlModulesEntity parseDbSqlModulesConfigXmlToObject(File file) {

        DbSqlModulesEntity dbSqlModulesEntity = new DbSqlModulesEntity();

        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            document = db.parse(file);

            Element element = document.getDocumentElement();

            // 获取<db-sql-modules>
            Element dbSqlModulesElement = (Element) element.getElementsByTagName("db-sql-modules").item(0);

            // 获取<db-sql-modules>中<module>节点列表
            NodeList dbSqlModuleItemNodes =dbSqlModulesElement.getElementsByTagName("module");

            List<DbSqlModuleItemEntity> dbSqlModuleItemEntityList = new ArrayList<>();

            for (int i = 0; i < dbSqlModuleItemNodes.getLength(); i++) {
                DbSqlModuleItemEntity dbSqlModuleItemEntity = new DbSqlModuleItemEntity();

                // 获得<module>的属性
                Element dbSqlModuleItemElement = (Element) dbSqlModuleItemNodes.item(i);
                dbSqlModuleItemEntity.setId((dbSqlModuleItemElement.getAttribute("id")));
                dbSqlModuleItemEntity.setName(dbSqlModuleItemElement.getAttribute("name"));
                dbSqlModuleItemEntity.setNickname(dbSqlModuleItemElement.getAttribute("nickname"));
                dbSqlModuleItemEntity.setPkg(dbSqlModuleItemElement.getAttribute("pkg"));
                dbSqlModuleItemEntity.setUrl((dbSqlModuleItemElement.getAttribute("url")));
                dbSqlModuleItemEntity.setTable((dbSqlModuleItemElement.getAttribute("table")));
                dbSqlModuleItemEntity.setDescription((dbSqlModuleItemElement.getAttribute("description")));
                dbSqlModuleItemEntity.setStatus((dbSqlModuleItemElement.getAttribute("status")));

                dbSqlModuleItemEntityList.add(dbSqlModuleItemEntity);
            }

            dbSqlModulesEntity.setDbSqlModuleItemEntityList(dbSqlModuleItemEntityList);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return dbSqlModulesEntity;
    }

    /**
     * 将XML中侧边栏配置部分解析封装为List对象
     * List<DbSqlModuleItemEntity>
     */
    public List<DbSqlModuleItemEntity> parseDbSqlModulesConfigXmlToObjectList(File file) {
        return this.parseDbSqlModulesConfigXmlToObject(file).getDbSqlModuleItemEntityList();
    }

    /**
     * 单例模式 - 取得实例方法
     * @return
     */
    public static DbSqlModulesConfigXmlDomParser getDbSqlModulesConfigXmlDomParser() {
        return dbSqlModulesConfigXmlDomParser;
    }
}